using System;
using System.IO;

using Org.BouncyCastle.Utilities;

namespace Org.BouncyCastle.Bcpg
{
	/**
	* Basic type for a user attribute sub-packet.
	*/
	public class UserAttributeSubpacket
	{
		private readonly UserAttributeSubpacketTag	type;
		private readonly byte[]						data;

		internal UserAttributeSubpacket(
			UserAttributeSubpacketTag	type,
			byte[]						data)
		{
			this.type = type;
			this.data = data;
		}

		public UserAttributeSubpacketTag SubpacketType
		{
			get { return type; }
		}

		/**
		* return the generic data making up the packet.
		*/
		public byte[] GetData()
		{
			return data;
		}

		public void Encode(
			Stream os)
		{
			int bodyLen = data.Length + 1;

			if (bodyLen < 192)
			{
				os.WriteByte((byte)bodyLen);
			}
			else if (bodyLen <= 8383)
			{
				bodyLen -= 192;

				os.WriteByte((byte)(((bodyLen >> 8) & 0xff) + 192));
				os.WriteByte((byte)bodyLen);
			}
			else
			{
				os.WriteByte(0xff);
				os.WriteByte((byte)(bodyLen >> 24));
				os.WriteByte((byte)(bodyLen >> 16));
				os.WriteByte((byte)(bodyLen >> 8));
				os.WriteByte((byte)bodyLen);
			}

			os.WriteByte((byte) type);
			os.Write(data, 0, data.Length);
		}

		public override bool Equals(
			object obj)
		{
			if (obj == this)
				return true;

			UserAttributeSubpacket other = obj as UserAttributeSubpacket;

			if (other == null)
				return false;

			return type == other.type
				&& Arrays.AreEqual(data, other.data);
		}

		public override int GetHashCode()
		{
			return type.GetHashCode() ^ Arrays.GetHashCode(data);
		}
	}
}
